#include "UART/G4_app.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

/**
 ****************************************************************************************************
 * DONE 用户变量区
 ****************************************************************************************************
 */

char G4_data[BUFF_MAX];

uint8_t IP[] = {0};
uint8_t PORT[] = {0};

char * point =NULL;
char * nextpoint =NULL;
uint8_t tempvar=0;

#define GPS_DATA_HUART bear_huart



/**
 ****************************************************************************************************
 * 初始化区
 ****************************************************************************************************
 */


 /**
  * @name 4G模块初始化
  * @brief 初始化4G模块
  * @param G4_WIFI_MODE：选择初始化连接方式，G4_WIFI_MQTT为MQTT协议连接，G4_WIFI_TCP为TCP协议连接，G4_WIFI_UDP为UDP协议连接
  */
void G4_Init(G4_WIFIMODE G4_WIFI_MODE)
{
    switch (G4_WIFI_MODE)
    {
    case G4_WIFI_MQTT:C511_TO_MQTT();
        break;
    case G4_WIFI_TCP:C511_TO_TCP(IP,PORT);
        break;
    case G4_WIFI_UDP:C511_TO_UDP(IP,PORT);
        break;
    default:
        break;
    }
	
}

/**
 * @name 4G模块GNSS数据转换
 * @brief 转换GNSS数据
 */
void Data_Transfor(UART_HandleTypeDef *huart)
{
	double latitude = 0;//存储纬度消息
	double longitude = 0;//存储经度消息
	// float tim = 0;//存储时间消息
	uint16_t temp1=0;//临时变量1 存储整数
	uint16_t temp2=0;//临时变量2 存储整数
	// uint16_t temp3=0;//临时变量3 存储整数
	latitude = strtod(gps.GPS_lat,NULL);
	longitude = strtod(gps.GPS_lon,NULL);
	// tim = strtod(gps.UTCTime,NULL);
	if( (double)latitude - 10000.0 >= 0 )
	{
		//前三位单独拿出来组成一个数
		temp1 =   (((uint16_t)latitude/10000)%10)*100 + (((uint16_t)latitude/1000)%10)*10+ (((uint16_t)latitude/100)%10);
		latitude = latitude - temp1*100.0;
		latitude =  temp1*1.0 + latitude/60;
		USART_printf(huart,"W:%.6f",latitude);
	}
	else
	{
		temp1 =  (((uint16_t)latitude/1000)%10)*10+ (((uint16_t)latitude/100)%10);
		latitude = latitude - temp1*100.0;
		latitude =  temp1*1.0 + latitude/60;
		USART_printf(huart,"W:%.6f",latitude);
	}
	if( (double)longitude - 10000.0 >= 0 )
	{
		//前三位单独拿出来组成一个数
		temp2 =   (((uint16_t)longitude/10000)%10)*100 + (((uint16_t)longitude/1000)%10)*10+ (((uint16_t)longitude/100)%10);
		longitude = longitude - temp2*100.0;
		longitude =  temp2*1.0 + longitude/60;
		USART_printf(huart,"J:%.6f",longitude);
	}
	else
	{
		temp2 =  (((uint16_t)longitude/1000)%10)*10+ (((uint16_t)longitude/100)%10);
		longitude = longitude - temp2*100.0;
		longitude =  temp2*1.0 + longitude/60;
		USART_printf(huart,"J:%.6f",longitude);
	}
	// USART_printf(huart,"time %c%c:%c%c:%c%c\r\n",gps.UTCTime[0],gps.UTCTime[1],gps.UTCTime[2],gps.UTCTime[3],gps.UTCTime[4],gps.UTCTime[5]);
	// USART_printf(huart,"date %c%c:%c%c:%c%c\r\n",gps.GPS_date[4],gps.GPS_date[5],gps.GPS_date[2],gps.GPS_date[3],gps.GPS_date[0],gps.GPS_date[1]);

}

/**
 ****************************************************************************************************
 * DONE 用户函数区
 ****************************************************************************************************
 */


void G4_ADCDATA_Dispose(void)
{
	// ADC_DATA_Dispose(G4_huart);

    // sprintf(G4_data,"AT+MPUBX=\"/sys/k1zy30ORGH4/esp8266/thing/event/property/post_reply\",0,0,40");
	// WIFI_SEND(G4_huart,(uint8_t*)G4_data);
    // while(!WIFI_CheckAck("AT+MPUBX=\"/sys/k1zy30ORGH4/esp8266/thing/event/property/post\",0,0,40\r\n",">",4000));
    // sprintf(G4_data,"{value:{{data1:\"32\"}{data2:\"21\"}}}");
    sprintf(G4_data,"AT+MPUB=\"/sys/k1zy30ORGH4/esp8266/thing/event/property/post\",0,0,\"hello\"\r\n");
	WIFI_SEND(G4_huart,(uint8_t*)G4_data);
}


/**
 * @name 启动GNSS
 * @brief 启动GNSS
 */
void G4_GNSS_Start(void)
{
    while(!WIFI_CheckAck("AT+QICSGP=1,1,\"\",\"\",\"\"\r\n","OK",3000));//连接网络
	delay_us(1000000);
    while(!WIFI_CheckAck("AT+MGPSC=1\r\n","OK",3000));//开启GNSS定位功能
	delay_us(1000000);
    WIFI_CheckAck("AT+AGNSSGET=pos.asrmicro.com\r\n","OK",3000);//设置GPS服务器地址
	delay_us(1000000);
    while(!WIFI_CheckAck("AT+AGNSSSET\r\n","OK",3000));//下载辅助定位数据
	delay_us(1000000);
    while(!WIFI_CheckAck("AT+MGPSGET=ALL,1\r\n","OK",3000));//显示NMEA信息
	delay_us(1000000);
	GPS_START_FLAG = 1;
}

/**
 * @name 4G模块GNSS数据处理
 * @brief 解析GNSS数据
 */
void G4_GNSSDATA_Dispose(UART_HandleTypeDef *huart)
{
	if(gps.buff_flag == 1)
	{
		USART_printf(Test_huart,"Dispose START\r\n");
		if(strstr((char*)gps.Frame_Buffer,"GNRMC")!=NULL)
		{
			for(tempvar=0;tempvar < 10;tempvar++)
			{
			if(tempvar==0)
			{
				if((point = strstr((char*)gps.Frame_Buffer,","))==NULL)
				{
					USART_printf(huart,"Prase errer\r\n");
				}
			}
			else
			{
				point++;
				if((nextpoint = strstr(point,","))!=NULL)
				{
				
				switch(tempvar)
				{
					case 1: // 时间
                    memcpy(gps.UTCTime, point, nextpoint - point);
                    	break;
                	case 2: // 状态
                    memcpy(gps.GPS_Status, point, nextpoint - point);
                    	break;
                	case 3: // 纬度
                    memcpy(gps.GPS_lat, point, nextpoint - point);
                    	break;
               	 	case 4: // 纬度方向
                    memcpy(gps.GPS_ulat, point, nextpoint - point);
                    	break;
                	case 5: // 经度
                    memcpy(gps.GPS_lon, point, nextpoint - point);
                    	break;
                	case 6: // 经度方向
                    memcpy(gps.GPS_ulon, point, nextpoint - point);
                    	break;
                	case 7: // 地面速度
                    memcpy(gps.GPS_spd, point, nextpoint - point);
                    	break;
                	case 8: // 航向角
                    memcpy(gps.GPS_cog, point, nextpoint - point);
                    	break;
                	case 9: // 日期
                    memcpy(gps.GPS_date, point, nextpoint - point);
                    	break;
				}
				point = nextpoint;	
				}
				else
				{
					USART_printf(huart,"Prase errpr\r\n");
				}
			}
			}
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
			//解析数据
			Data_Transfor(huart);
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
		}
		
			gps.buff_flag = 0;
			gps.buff_length=0;
			memset(gps.Frame_Buffer,0,sizeof(gps)/sizeof(gps.buff_flag));
	
	}
}

// void mqtt_rx_Control(void)
// {
// 		char *ptr = NULL;
// 		u8  number;
// 	if(wifi.buff_flag == 1)
// 	{
// 		if(strstr((char *)wifi.BUFF,"+MSUB: \"app\"")!=NULL)     //服务端接收数据判断
// 		{
// 			ptr = strrchr((char*)wifi.BUFF,',');           // 以最后一个,为准后面为数据
// 			number = *(ptr+2)-'0';
// 			switch(number)
// 							{
// 							 case 1: LED_OFF();  break;
// 							 case 2: LED_ON();   break;
// 							 case 3:OLED_SHOW(); break;
// 							 case 4:OLED_Clear();break;
// 							 case 5:Motor_Control1(); break;
// 							 case 6:Motor_Control2(); break;
// 							 case 7:Motor_Control3(); break;
// 							 default:  return;
// 							}
// 		}
// 	WIFI_BUFF_MEMSET();			
// 	}
// }
// /****************************************
//  *  服务器接收判断函数： WIFI_Config()    
//  *                                      
//  *  LED开：1  LED关：2
//  *  
//  *  OLED开：3  OLED关：4
//  *
//  *  电机正转：5  电机反转：6 
// *****************************************/
// u8 Flag = 1;                  //客户端连接标志位
// void wifi_rx_Control(void)
// {
// 		char *ptr = NULL;
// 		u8  number;
// 		if(wifi.buff_flag == 1)
// 		{
// 			if(strstr((char *)wifi.BUFF,"192.168.0")!=NULL)     //服务端接收数据判断
// 			{
// 						ptr = strrchr((char*)wifi.BUFF,',');           // 以最后一个,为准后面为数据

// 					  if(strlen(ptr)-3==1)                      //判断接收到为一位数据   ,*\r\n
// 						{
// 							number = ptr[1]-'0';
// 							switch(number)
// 							{
// 							 case 1: LED_OFF();  break;
// 							 case 2: LED_ON();   break;
// 							 case 3:OLED_SHOW(); break;
// 							 case 4:OLED_Clear();break;
// 							 case 5:Motor_Control1(); break;
// 							 case 6:Motor_Control2(); break;
// 							 case 7:Motor_Control3(); break;
// 							 default:  return;
// 							}						 
// 						}
// 			 }  
// 			 else if(strstr((char *)wifi.BUFF,"RECV:test-app")!=NULL)
// 			{
// 				ptr = strrchr((char*)wifi.BUFF,',');           // 以最后一个,为准后面为数据

// 						  if(strlen(ptr)-3==1)                      //判断接收到为一位数据   ,*\r\n
// 							{
// 								number = ptr[1]-'0';
// 								switch(number)
// 								{
// 								 case 1: LED_OFF();  break;
// 								 case 2: LED_ON();   break;
// 								 case 3:OLED_SHOW(); break;
// 								 case 4:OLED_Clear();break;
// 								 case 5:Motor_Control1(); break;
// 								 case 6:Motor_Control2(); break;
// 								 case 7:Motor_Control3(); break;
// 								 default:  return;
// 								}						 
// 							}
				
// 			}
// 		}
		
// 		WIFI_BUFF_MEMSET();
// }

